#include "appearance.h"

Appearance::Appearance(QWidget *parent, QString str, int scale) : QWidget(parent)
{
    ptr = str;
    number = 0.0; // 或者具体的初始值
    // 初始化新增的变量
    m_IntSartAngle = 30.0; // 起始角度
    m_IntEndAngle = 30.0;  // 结束角度
    m_IntScaleMajor = 10;  // 主刻度
    m_IntScaleMinor = 5;   // 副刻度
    m_ColorRingStart = QColor(255, 0, 0); // 红色
    m_ColorRingMid = QColor(255, 255, 0);  // 黄色
    m_ColorRingEnd = QColor(0, 255, 0);    // 绿色
    m_IntRingStartPercent = 20.0;  //
    m_IntRingMidPercent = 60.0;    //
    m_IntRingEndPercent = 20.0;    //
    m_dMaxValue = scale;           //
    m_dMinValue = 0.0;             //
    m_dCurrentValue = 0.0;        //
    m_pointerColor = QColor(0, 0, 255); // 指针颜色，蓝色

    m_timer = new QTimer(this);
    m_timer->setInterval(1000);

    connect(m_timer, &QTimer::timeout, this, [this]() {
        // 假设每次定时器触发更新一次数据
        number = qrand() % 101;
        // 更新 m_dCurrentValue 使指针跟随 number 变化
        if (ptr == "电流(A)") {
            m_dCurrentValue = qBound(m_dMinValue, number, m_dMaxValue); // 保证在最小值和最大值之间
            updateNum(number);
        }else if (ptr == "电压(V)") {
            m_dCurrentValue = qBound(m_dMinValue, number, m_dMaxValue); // 保证在最小值和最大值之间
            updateNum(number);
        }else if (ptr == "功率(KW)") {
            m_dCurrentValue = qBound(m_dMinValue, number, m_dMaxValue); // 保证在最小值和最大值之间
            updateNum(number);
        }

    });

    m_timer->start();


}

Appearance::~Appearance()
{
    m_timer->stop(); // 停止定时器
}

void Appearance::updateNum(double val)
{
    number = val; // 更新数值
//    ptr = str;    // 更新表名
    update();     // 触发重绘
}

void Appearance::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event); // 忽略事件，避免未使用警告

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing); // 开启抗锯齿

    // 计算中心点和半径
    int centerX = width() / 2;
    int centerY = height() / 2;
    int radius = qMin(centerX, centerY) - 10; // 留出边距

    // 偏移坐标轴到窗口中心
    painter.translate(centerX, centerY);

    // 保存当前状态
    painter.save();

    // 绘制刻度
    drawScale(&painter);

    // 绘制指针
    drawPointer(&painter);

    // 绘制当前 number 的值和 ptr
//    painter.setPen(Qt::black); // 设置文本颜色为黑色
//    QPoint textPos(centerX , centerY - 20); // 文本位置
//    //    painter.drawText(textPos, QString("当前值: %1").arg(number)); // 绘制当前值
//    //    painter.drawText(textPos + QPoint(0, 20), QString("表名: %1").arg(ptr)); // 绘制表名
//    painter.drawText(textPos, QString::number(number, 'f', 1)); // 保留一位小数
//    painter.drawText(textPos + QPoint(0, 20), QString(ptr)); // 表名
//    qDebug() << "number:" << number << "ptr:" << ptr;
    drawNumberAndPtr(&painter, radius);

    // 恢复状态
    painter.restore();
}

void Appearance::drawScale(QPainter *painter)
{
    painter->save();

    const int radius = 114; // 固定的圆半径
    const int lineWidthMajor = 2.5; // 主刻度线宽度
    const int lineWidthMinor = 1.5; // 副刻度线宽度
    QPen pen;
    pen.setCapStyle(Qt::RoundCap);

    // 计算总刻度
    int totalSteps = (m_IntScaleMajor * m_IntScaleMinor);
    if (totalSteps <= 0) {
        painter->restore();
        return; // 早期返回，避免进一步计算
    }

    painter->rotate(m_IntSartAngle);
    double angleStep = (360.0 - m_IntSartAngle - m_IntEndAngle) / totalSteps;

    // 计算刻度值的范围
    int indexStart = totalSteps * (m_IntRingStartPercent / 100.0) + 1;
    int indexMid = totalSteps * (m_IntRingMidPercent / 100.0) - 1;
    int indexEnd = totalSteps * (m_IntRingEndPercent / 100.0) + 1;

    // 绘制刻度
    for (int i = 0, index = 0; i <= totalSteps; i++) {
        // 确定颜色
        if (i % m_IntScaleMinor == 0) {
            if (index < indexStart) {
                pen.setColor(m_ColorRingStart);
            } else if (index < (indexStart + indexMid)) {
                pen.setColor(m_ColorRingMid);
            } else if (index < (indexStart + indexMid + indexEnd)) {
                pen.setColor(m_ColorRingEnd);
            }

            pen.setWidthF(lineWidthMajor);
            painter->setPen(pen);
            painter->drawLine(0, radius - 13, 0, radius);

            // 计算刻度值并绘制文本 0 + （100 - 0） * （1/50)
            pen.setColor(Qt::blue);
            double scaleValue = (m_dMinValue + (m_dMaxValue - m_dMinValue) * (static_cast<double>(index * 10) / totalSteps)) / 2;
//            qDebug() << "scaleValue:" << scaleValue;
            QString scaleText = QString::number(scaleValue, 'f', 0); // 保留一位小数
            QFontMetrics metrics(painter->font());
            int textWidth = metrics.width(scaleText); // 使用 width() 获取文本宽度
            painter->drawText(QPoint(-textWidth / 2, radius - 30), scaleText); // 文本位置调整

            index++;
        } else {
            pen.setWidthF(lineWidthMinor);
            pen.setColor(QColor(0, 255, 255)); // 副刻度颜色
            painter->setPen(pen);
            painter->drawLine(0, radius - 5, 0, radius);
        }

        painter->rotate(angleStep); // 旋转到下一个刻度
    }


    painter->restore();
}



void Appearance::drawPointer(QPainter *painter)
{
    int radius = 62;
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(m_pointerColor);

    QPolygon pts;
    pts.setPoints(4, -5, 0, 0, -8, 5, 0, 0, radius);

    painter->rotate(m_IntSartAngle);
    double degRotate = (360.0 - m_IntSartAngle - m_IntEndAngle) / (m_dMaxValue - m_dMinValue) * (m_dCurrentValue - m_dMinValue);
    painter->rotate(degRotate);
    painter->drawConvexPolygon(pts);

    painter->restore();
}

void Appearance::drawNumberAndPtr(QPainter *painter, int radius)
{
        // 绘制当前值的数字
        painter->setPen(Qt::black);
        QFont font = painter->font();
        font.setPointSize(10);  // 设置字体大小
        painter->setFont(font);
        QString numberText = QString::number(number, 'f', 1); // 保留一位小数
        QFontMetrics metrics(painter->font());
        int textWidth = metrics.width(numberText); // 使用 width() 获取文本宽度
        painter->drawText(QPoint(-textWidth / 2, radius + 10), numberText); // 文本位置调整

        // 绘制指针标签
        QString ptrText = ptr;
        int ptrTextWidth = metrics.width(ptrText); // 使用 width() 获取文本宽度
        painter->drawText(QPoint(-ptrTextWidth / 2, radius + 30), ptrText); // 文本位置调整
}
